package com.satan.juc.demo19;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
/*
SynchronousQueue 是 Java 中的一个阻塞队列，它不存储元素，每个插入操作必须等待另一个线程的移除操作，反之亦然。
这意味着 SynchronousQueue 实际上是一个没有数据缓冲的队列，你不能在队列中进行 peek 操作，因为元素只有在你试图移除它的时候才存在。
*/
public class SynchronousQueueExample {
    //在这个例子中，生产者线程尝试向 SynchronousQueue 中插入元素，如果没有消费者线程等待接收，生产者线程将会阻塞。
    //消费者线程尝试从队列中取出元素，如果队列为空，消费者线程将会阻塞。
    // 这种机制确保了生产者和消费者的同步交换，适用于线程间单个元素的传递场景。
    public static void main(String[] args) {
        SynchronousQueue<Integer> queue = new SynchronousQueue<>();

        // 生产者线程
        Thread producer = new Thread(() -> {
            try {
                for (int i = 0; i < 50000; i++) {
                    //System.out.println("生产者准备插入元素: " + i);
                    queue.put(i); // 如果没有消费者线程等待接收，则会阻塞
                    System.out.println("生产者插入元素: " + i);
                    // 暂停一会儿，让消费者线程有机会取出元素
                    TimeUnit.SECONDS.sleep(1);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 消费者线程
        Thread consumer = new Thread(() -> {
            try {
                while (true) {
                    // 如果没有生产者线程插入元素，则会阻塞
                    Integer item = queue.take();
                    System.out.println("消费者取出元素: " + item);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        producer.start();
        consumer.start();
    }
}
